package com.sky.module.system.user.controller;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sky.module.system.permission.domain.dto.UserRoleDTO;
import com.sky.module.system.role.domain.entity.Role;
import com.sky.module.system.role.domain.vo.RoleQueryVo;
import com.sky.module.system.role.service.RoleService;
import com.sky.module.system.user.domain.entity.User;
import com.sky.module.system.user.domain.vo.UserQueryVo;
import com.sky.module.system.user.service.UserService;
import com.sky.utils.Result;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author zsg
 * @since 2023-02-20
 */
@RestController

@RequestMapping("api/user")
public class UserController {

    @Resource
    private PasswordEncoder passwordEncoder;
    @Resource
    private UserService userService;

    @Resource
    private RoleService roleService;

    @RequestMapping("t1")
    public String t1() {
        final Result<String> ok = Result.ok("");
        return "好心分手";
    }

    /***
     * @description 查询所有
     *
     * @return com.zsg.utils.Result<?>
     * @date 2023/2/20 9:21
     *
     */
    @RequestMapping("listAll")
    public Result<?> listAll() {
        return Result.ok(userService.list());
    }


    /***
     * @description 查询用户信息
     * @param userQueryVo
     * @return com.zsg.utils.Result
     * @date 2023/2/23 22:56
     *
     */
    @GetMapping("/list")
    public Result list(UserQueryVo userQueryVo) {
        final Page<User> page = new Page<>(userQueryVo.getPageNo(), userQueryVo.getPageSize());
        final IPage<User> userIPage = userService.findUserListByPage(page, userQueryVo);
        return Result.ok(userIPage);
    }


    /***
     * @description TODO
     * @param user
     * @return com.zsg.utils.Result
     * @date 2023/2/23 23:05
     *
     */
    @PostMapping("/add")
    public Result add(@RequestBody User user) {
        User item = userService.findUserByUserName1(user.getUsername());
        if (item != null) {
            return Result.error().message("改用户名已存在");
        }
//        判断对象是否为空
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        if (userService.save(user)) {
            return Result.ok().message("用户添加成功");
        }
        return Result.error().message("用户添加失败");
    }

    @PutMapping("/update")
    public Result update(@RequestBody User user) {
//         修改后的username
        User item = userService.findUserByUserName1(user.getUsername());
        // 说明名称已经被占用了 TODO 如果没有不相等的话，万一用户没有去修改名字的话，那就是查出来自己原来的名字是一样的
        if (item != null && user.getId() != item.getId()) {
            return Result.error().message("该用户名已被使用，请重新输入");
        }
        if (userService.updateById(user)) {

            return Result.ok().message("修改用户信息成功");
        }
        return Result.error().message("修改用户信息失败");
    }

    @DeleteMapping("delete/{id}")
    public Result delete(@PathVariable("id") Long id) {
        if (userService.deleteById(id)) {
            return Result.ok().message("删除用户成功");
        }
        return Result.error().message("删除用户失败");

    }

    /***
     * @description 获取当前登录用户所拥有的分配角色列表
     * @param roleQueryVo
     * @return com.zsg.utils.Result
     * @date 2023/2/24 2:13
     *
     */
    @GetMapping("/getRoleListAssign")
    public Result getRoleListAssign(RoleQueryVo roleQueryVo) {
        User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        roleQueryVo.setUserId(user.getId());
        Page<Role> page = new Page<>(roleQueryVo.getPageNo(), roleQueryVo.getPageSize());
        // 和查询角色列表一样，只能查询当前用户所创建的，除非是管理员
        roleService.findRoleListByPage(page, roleQueryVo);
        return Result.ok(page);
    }

    /***
     * @description 根据用户ID查询该用户拥有的角色列表 -数据回显
     * @param userId 从线程上下文中获取
     * @return com.zsg.utils.Result
     * @date 2023/2/24 2:21
     *
     */
    @GetMapping("/getRoleByUserId/{userId}")
    public Result getRoleByUserId(@PathVariable("userId") Long userId) {
//        User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
//        Long userId = user.getId();
        List<Long> roleIdList = roleService.findRoleIdByUserId(userId);
        return Result.ok(roleIdList);
    }

    /***
     * @description 分配角色
     * @param userRoleDTO
     * @return com.zsg.utils.Result
     * @date 2023/2/24 10:52
     *
     */
    @PostMapping("/saveUserRole")
    public Result saveUserRole(@RequestBody UserRoleDTO userRoleDTO) {
        if (userService.saveUserRole(userRoleDTO.getUserId(), userRoleDTO.getRoleIds())) {
            return Result.ok().message("角色分配成功");
        }
        return Result.error().message("角色分配失败");
    }
}

